package com.chat.util;

import cn.hutool.core.io.resource.ClassPathResource;
import cn.hutool.json.JSONArray;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.List;

/**
 * JSON 工具类
 *
 * @author wb
 * @since 2024-08-20
 */
public class JSONUtil {

    /**
     * 读取 JSON 内容转换成对象
     *
     * @param filePath 文件路径
     * @param clazz    对象类型
     * @return 对象
     */
    public static <T> T readJsonToObject(String filePath, Class<T> clazz) {
        if (filePath == null || clazz == null) {
            throw new IllegalArgumentException("filePath and clazz cannot be null");
        }
        try {
            // 获取文件路径
            String path = new ClassPathResource(filePath).getFile().getAbsolutePath();

            // 使用try-with-resources确保流自动关闭
            try (InputStream stream = Files.newInputStream(Paths.get(path))) {
                // 读取文件内容
                String jsonString = readAllBytesAsString(stream);

                // 将JSON字符串转换为指定类型的对象
                return cn.hutool.json.JSONUtil.toBean(jsonString, clazz);
            }
        } catch (IOException e) {
            // 这里可以根据业务需求，抛出更具体的业务异常
            throw new RuntimeException("Error reading file: " + e.getMessage(), e);
        }
    }

    /**
     * 读取 JSON 内容转换成对象集合
     *
     * @param filePath 文件路径
     * @param clazz    对象类型
     * @return 对象集合
     */
    public static <T> List<T> readJsonToList(String filePath, Class<T> clazz) {
        if (filePath == null || clazz == null) {
            throw new IllegalArgumentException("filePath and clazz cannot be null");
        }
        try {
            // 获取文件路径
            String path = new ClassPathResource(filePath).getFile().getAbsolutePath();

            // 使用try-with-resources确保流自动关闭
            try (InputStream stream = Files.newInputStream(Paths.get(path))) {
                // 读取文件内容
                String jsonString = readAllBytesAsString(stream);

                // 将JSON字符串转换为JSONArray
                JSONArray jsonArray = cn.hutool.json.JSONUtil.parseArray(jsonString);

                // 将JSONArray转换为指定类型的列表
                return jsonArray.toList(clazz);
            }
        } catch (IOException e) {
            // 这里可以根据业务需求，抛出更具体的业务异常
            throw new RuntimeException("Error reading file: " + e.getMessage(), e);
        }
    }

    /**
     * 从输入流中读取所有字节并转换为字符串
     *
     * @param stream 输入流
     * @return 字符串
     * @throws IOException 读取过程中出现的异常
     */
    private static String readAllBytesAsString(InputStream stream) throws IOException {
        ByteArrayOutputStream result = new ByteArrayOutputStream();
        byte[] buffer = new byte[1024];
        int length;
        while ((length = stream.read(buffer)) != -1) {
            result.write(buffer, 0, length);
        }
        return result.toString(String.valueOf(StandardCharsets.UTF_8));
    }
}
